package pkg.finalproyectEJB;

import java.util.Date;
import java.util.ArrayList;

import javax.ejb.Stateless;
import javax.persistence.EntityManager;
import javax.persistence.PersistenceContext;
import javax.persistence.Query;

/**
 * Contiene la session bean del proyecto y contiene los metodos que se
 * comunican con la base de datos.
 * 
 * @author lorenzoveas.trainee@tinet.cl
 * @author Lorenzo Andres Veas Veas.
 */
@Stateless(name = "FinalEJBLocal", mappedName = "FinalEJBLocal")
public class FinalEJB implements FinalEJBLocal {

    /**
     * Atributo EntityManager lo utilizaremos para manipular la informacion de
     * la base de datos.
     */
    @PersistenceContext(unitName = "JPABD7")
    private EntityManager entityManager;

    /**
     * Constructor por defecto de la clase FinalEJB.
     */
    public FinalEJB() {

    }

    /**
     * {@inheritDoc}
     * 
     * */
    public ArrayList<Producto> listarProductos(int pagina) {
        @SuppressWarnings("unchecked")
       Query arregloProducto =  entityManager.createQuery("select p from Producto p where p.cantidad>0");
        arregloProducto.setMaxResults(10);
        arregloProducto.setFirstResult(10*(pagina-1));
        ArrayList<Producto> producto = (ArrayList<Producto>)arregloProducto.getResultList();
        return producto;
    }

    /**
     * {@inheritDoc}
     * 
     **/
    public Usuario verificar(String nom, String pass) {

        Usuario user = (Usuario) entityManager.find(Usuario.class, nom);
        if (user != null) {
            if (user.getPass().equals(pass)) {
                return user;
            }

            return  user;
        } else {

            return new Usuario();
        }

    }

    /** {@inheritDoc} */
    public boolean compraFinalizada(String nom, ArrayList<Productoarraycar> prod) {

        if (prod.isEmpty()) {
            return false;
        }
        entityManager.persist(new Carro(nom, 1, new Date()));
        Query query =
                entityManager.createQuery("Select MAX(c.ID_CARRO) FROM Carro C"
                        + " where c.nombreUsuario = :nombre");
        query.setParameter("nombre", nom);
        Integer idCarro = (Integer) query.getSingleResult();
        boolean error = false;
        ArrayList<DetalleCarro> auxDetalle = new ArrayList<DetalleCarro>();
        for (Productoarraycar p : prod) {
            Producto pro =
                    (Producto) entityManager.find(Producto.class, p.getId());
            auxDetalle.add(new DetalleCarro((int) idCarro, p.getId(), p
                    .getCantidad()));
            if (pro.getCantidad() == 0) {
                error = true;
            }
        }

        if (error == true) {
            Carro carro = entityManager.find(Carro.class, idCarro);
            entityManager.remove(carro);
            for (DetalleCarro dCarro : auxDetalle) {
                entityManager.remove(dCarro);

            }
        } else {
            for (Productoarraycar p : prod) {
                Producto pro =
                        (Producto) entityManager
                                .find(Producto.class, p.getId());
                pro.setCantidad(pro.getCantidad() - p.getCantidad());
                entityManager.persist(new DetalleCarro((int) idCarro,
                        p.getId(), p.getCantidad()));
            }

        }

        if (error == false) {
            return true;
        } else {
            return false;
        }

    }

    /**
     * {@inheritDoc}
     * 
     * */
    public void agregarUsuario(String nom, String pass, String nombre,
            String apellido) {

        Usuario u = new Usuario(nom, pass, nombre, apellido);
        entityManager.persist(u);
    }

}
